perm filename BLOWUP.SAI[DD,BGB] blob sn#027907 filedate 1973-07-18 generic text, type T, neo UTF8
COMMENT ⊗   VALID 00013 PAGES 
RECORD PAGE   DESCRIPTION
 00001 00001
 00003 00002	BEGIN	"BLOWUP"
 00004 00003		PRELOAD_WITH 1,2,3,4,0,0
 00005 00004	PROCEDURE CARCAM
 00006 00005	α WINDOW MOVING KEYS
 00008 00006	α WINDOW SIZE CONTROL KEYS
 00009 00007	PROCEDURE DIGIT
 00010 00008	PROCEDURE INSERIES
 00011 00009	α INPUT A 216 BY 288 TV IMAGE FROM THE DSK
 00012 00010	PROCEDURE XXXXXX
 00013 00011	α ASCII  00  TO  37 
 00014 00012	α ASCII 40 TO 77
 00015 00013		IF CHR<"a" THEN CASE CHR-'133  OF 
 00016 ENDMK
⊗;
BEGIN	"BLOWUP"
	REQUIRE "ABBREV[SYS,BGB]" SOURCE_FILE;
	REQUIRE "DD[DD,BGB]" SOURCE_FILE;
α LEAPING LIZARDS;
	REQUIRE 100 NEW_ITEMS;
	REQUIRE 100 PNAMES;
α TELETYPE COMMAND STATE;
	INTEGER CHR,CTRL,META,LETT,MCBITS;
α SOURCE AND OBJECT WINDOWS;
	DEFINE
	SX. = "DATUM(SWINDO)[1]",
	SY. = "DATUM(SWINDO)[2]",
	DX. = "DATUM(SWINDO)[3]",
	DY. = "DATUM(SWINDO)[4]",
	OX. = "DATUM(OWINDO)[1]",
	OY. = "DATUM(OWINDO)[2]",
	MP = "DATUM(OWINDO)[3]";
INTEGER FLG;
	PRELOAD_WITH 1,2,3,4,0,0;
	SAFE INTEGER ARRAY CHAN[1:7];
α NEW _DPYDD CALLS DDJOB;
	PROCEDURE _DPYDD; DPYDD(CVIS(TVFILE,FLG),∂(SWINDO),∂(OWINDO),CHAN);
α SET CHANNELS;
	PROCEDURE SETCHN;
BEGIN	"SETCHN"
	INTEGER I,ARG;
	ARG	←	INCHRW;
	IF ARG≤"0" ∨ "7"≤ARG THEN RETURN;
	ARG	←	ARG LAND 7;
	CHAN[1]	←	0;
	ARRBLT(CHAN[2],CHAN[1],5);
	IF CHR="←" THEN CHAN[ARG]←1 ELSE
	IF CHR="↑" THEN FOR I←1 STEP 1 UNTIL ARG DO CHAN[I]←I ELSE
	IF CHR="↓" THEN FOR I←1 STEP 1 UNTIL ARG DO CHAN[I]←I+1 ELSE
	RETURN;
	_DPYDD;
END	"SETCHN";
PROCEDURE CARCAM;
BEGIN	"CARCAM"
	DEFINE MM="*3.2808@-3";
	LDX	←	144;
	LDY	←	108;
	LDZ	←	500;
	PDX	←	5.3 MM;
	PDY	←	4.0 MM;
	FOCAL	←	12.5 MM;
	SCALX	←	-FOCAL*LDX/PDX;
	SCALY	←	-FOCAL*LDY/PDY;
	SCALZ	←	 FOCAL*LDZ;
END	"CARCAM";

PROCEDURE INITIALIZATION;
BEGIN	"INIT"
	INTEGER ARRAY ∂S[1:5],∂O[1:7];
	SWINDO	←	NEW(∂S);	NEW_PNAME(SWINDO,"S0");
	OWINDO	←	NEW(∂O);	NEW_PNAME(OWINDO,"O0");
	SX.←SY.←0;
	OX.	←	0;
	OY.	←	0;
	DX.	←	144;
	DY.	←	108;
	MP	←	0;
	DELTA	←	1;
	LINK	←	NEW;
	NIL	←	NEW;
	LOCOR	←	NEW;
	CARCAM;
	OUTSTR("*");
END	"INIT";
α WINDOW MOVING KEYS;
PROCEDURE MOVKEY;
BEGIN	"MOVKEY"
	IF META THEN 
BEGIN
	IF CHR=";" ∧ OX.-DELTA≥0     THEN OX.←OX.-DELTA ELSE
	IF CHR=":" ∧ OX.+DELTA≤511   THEN OX.←OX.+DELTA ELSE
	IF CHR="(" ∧ OY.+DELTA*8<480 THEN OY.←OY.+DELTA*8 ELSE
	IF CHR=")" ∧ OY.-DELTA*8≥0   THEN OY.←OY.-DELTA*8 ;
END	ELSE
	IF CTRL THEN
BEGIN
	IF CHR=";" THEN SX.←SX.-DELTA ELSE
	IF CHR=":" THEN SX.←SX.+DELTA ELSE
	IF CHR="(" THEN SY.←SY.-DELTA ELSE
	IF CHR=")" THEN SY.←SY.+DELTA;
END	ELSE
BEGIN
	IF CHR=";" THEN SX.←SX.-DX. ELSE
	IF CHR=":" THEN SX.←SX.+DX. ELSE
	IF CHR="(" THEN SY.←SY.-DY. ELSE
	IF CHR=")" THEN SY.←SY.+DY.;
END;
	IF SX.+DX.> 144 THEN SX.← 144-DX. ELSE
	IF SX.-DX.<-144 THEN SX.←-144+DX.;
	IF SY.+DY.> 108 THEN SY.← 108-DY. ELSE
	IF SY.-DY.<-108 THEN SY.←-108+DY.;
	_DPYDD;
END	"MOVKEY";
α WINDOW SIZE CONTROL KEYS;
PROCEDURE DELKEY;
BEGIN	"DELKEY"
	IF CHR="[" ∧ DY.≠1   THEN DY.←DY.-1 ELSE
	IF CHR="]" ∧ DY.≠108 THEN DY.←DY.+1 ELSE
	IF CHR="↑" ∧ DX.≠1   THEN DX.←DX.-1 ELSE
	IF CHR="↓" ∧ DX.≠144 THEN DX.←DX.+1;
	IF SX.+DX.> 144 THEN SX.← 144-DX. ELSE
	IF SX.-DX.<-144 THEN SX.←-144+DX.;
	IF SY.+DY.> 108 THEN SY.← 108-DY. ELSE
	IF SY.-DY.<-108 THEN SY.←-108+DY.;
	_DPYDD;
END	"DELKEY";
PROCEDURE DIGIT;
BEGIN	"DIGIT"
	INTEGER DIG;
	DEFINE OXY(X,Y)="BEGIN OX.←X;OY.←Y;END";
	DIG	←	CHR LAND '17;
	IF META THEN
CASE DIG OF
BEGIN
	OXY(0,0);
	OXY(128,120);
	OXY(-128,120);
	OXY(-128,-120);
	OXY(128,-120);
	OY.←120;
	OY.←-120;
	OX.←-128;
	OX.←0;
	OX.←128;
END	ELSE
CASE DIG OF
BEGIN
	SX.←SY.←0;
	MP←0;
	;
	;
	DX.←DY.←4;
	DX.←DY.←9;
	DX.←DY.←18;
	DX.←DY.←36;
	BEGIN DX.←72;DY.←54;END;
	BEGIN DX.←144;DY.←108;SX.←SY.←0;END;
END;
	IF SX.+DX.> 144 THEN SX.← 144-DX. ELSE
	IF SX.-DX.<-144 THEN SX.←-144+DX.;
	IF SY.+DY.> 108 THEN SY.← 108-DY. ELSE
	IF SY.-DY.<-108 THEN SY.←-108+DY.;
END	"DIGIT";
PROCEDURE INSERIES;
BEGIN	"INSERIES"
	INTEGER L,M,FLG;
	STRING STR,S;
	OPEN(1,"TTY",0,1,0,0,0,0);
	OUTSTR("	SERIES = ");S←INCHWL;
	OUTSTR("	FIRST  = ");L←INTIN(1);
	OUTSTR("	LAST   = ");M←INTIN(1);
	RELEASE(1);
	IF L>M THEN L↔M;
DO BEGIN
	STR	←	S&CVS(L);
α	DSKTV.;
	TVFILE←CVSI(STR,FLG);
	IF FLG THEN 
BEGIN 
	TVFILE←NEW(0);
	PUT TVFILE IN TVSET;
	NEW_PNAME(TVFILE,STR);
END;
END	UNTIL M<(L←L+1);
	OUTCHR("*");
END	"INSERIES";

α INPUT A 216 BY 288 TV IMAGE FROM THE DSK;
PROCEDURE INDSK;
BEGIN	"INDSK"
	STRING STR;
	INTEGER FLG;
	OPEN(1,"DSK",8,3,0,0,0,0);
	OUTSTR(13&10);
DO BEGIN
	EXTERNAL STRING TVSTR;
	IF LENGTH(TVSTR)=0 THEN BEGIN
	OUTSTR ("FILE = ");
	STR	←	INCHWL; END ELSE STR←TVSTR;
	IF STR<"A" ∨ "Z"<STR THEN BEGIN RELEASE(1);INSERIES;RETURN;END;
	LOOKUP(1,STR&".TMP[DAT,BGB]",FLG);
	TVSTR←"";
END	UNTIL ¬FLG;
	RELEASE(1);
	TVFILE←CVSI(STR,FLG);
	IF FLG THEN
BEGIN	TVFILE←NEW(0);
	PUT TVFILE IN TVSET;
	NEW_PNAME(TVFILE,STR);
END;
	OUTCHR("*");
END	"INDSK";
PROCEDURE XXXXXX;
BEGIN	"XXXXXX"
	WHILE TRUE DO 
BEGIN	"LISTEN"
	CHR	←	INCHRW;
	MCBITS	←	(CHR LSH -7)LAND 3;
	CTRL	←	CHR LAND '200;
	META	←	CHR LAND '400;
	CHR	←	CHR LAND '177;
	LETT	←	CHR LAND '37;
	IF "A"≤CHR ∧ CHR≤"Z" ∨ "a"≤CHR ∧ CHR≤"z" THEN 
	CASE LETT OF 
BEGIN	;
"A"	;
"B"	;
"C"	;
"D"	_DPYDD;
"E"	ERASTV;
"F"	;
"G"	;
"H"	;
"I"	INDSK;
"J"	;
"K"	;
"L"	;
"M"	;
"N"	;
"O"	;
"P"	;
"Q"	;
"R"	;
"S"	;
"T"	BEGIN EXTERNAL PROCEDURE TVSUBR;TVSUBR;INDSK;END;
"U"	;
"V"	;
"W"	;
"X"	;
"Y"	;
"Z"	;
END	ELSE
α ASCII  00  TO  37 ;
	IF CHR < "A" THEN CASE CHR OF BEGIN
"NULL"	;
"↓"	SETCHN;
"α"	;
"β"	;
"∧"	;
"¬"	;
"ε"	;
"π"	;
"λ"	;
"TAB"	;
"LF"	;
"VT"	;
"FF"	;
"CR"	OUTSTR("*");
"∞"	;
"∂"	;
"⊂"	;
"⊃"	;
"∩"	;
"∪"	;
"∀"	;
"∃"	;
"⊗"	;
"↔"	;
"_"	;
"→"	;
"TILDE"	;
"≠"	;
"≤"	;
"≥"	;
"≡"	;
"∨"	;
α ASCII 40 TO 77;
"SPACE"	;
"!"	;
""""	;
"#"	BEGIN INTEGER I;FOR I←1 STEP 1 UNTIL 30 DO OUTSTR(13&10);END;
"$"	;
"%"	;
"&"	;
"'"	;
"("	MOVKEY;
")"	MOVKEY;
"*"	MP←MP+1;
"+"	;
","	;
"-"	IF MP≠0 THEN MP←MP-1;
"."	;
"/"	IF DELTA≠1 THEN DELTA←DELTA-1;
"0"	DIGIT;
"1"	DIGIT;
"2"	DIGIT;
"3"	DIGIT;
"4"	DIGIT;
"5"	DIGIT;
"6"	DIGIT;
"7"	DIGIT;
"8"	DIGIT;
"9"	DIGIT;
":"	MOVKEY;
";"	MOVKEY;
"<"	;
"="	;
">"	;
"?"	;
"@"	;
END ELSE
	IF CHR<"a" THEN CASE CHR-'133  OF 
BEGIN
"["	DELKEY;
"\"	DELTA←DELTA+1;
"]"	DELKEY;
"↑"	SETCHN;
"←"	SETCHN;
"`"	;
END
	ELSE CASE CHR-'173 OF 
BEGIN
"{"	;
"|"	;
"ALTMODE"	;
"}"	;
"RUBOUT";
END;
END	"LISTEN";
END	"XXXXXX";

	INITIALIZATION;
	XXXXXX;
END	"BLOWUP"